<?php
/**
 * Created by ljg
 * User: ljg
 * Date: 2020/6/12
 * Time: 9:53
 * Content: 资源处理公共方法
 */

namespace app\service;
use BaseException;
use think\Exception;
use think\Session;

/**
 * Class ResourceService
 * @package app\service
 * @content 资源服务层
 */
class ResourceService
{
    /**
     * @param $mark 接收上传类型(是图片还是视频)(img:图片  video:视频)
     * @param string $_oldSrc   接收要删除的图片/视频信息
     * @param string $_field    接收上传的图片字段(banner/imgurl/picurl/video)
     * @return array
     */
    static function uploadFile($mark,$_oldSrc="",$_field="info")
    {

        if (!empty($mark)) {
            if ($mark == 'img') {
                # 上传图片
                $_filename = self::uploads($_field, $_oldSrc);
                if (!empty($_filename)) {
                    self::setUploadCache($_filename,$mark);
                    return array('status' => true, 'src' => $_filename, 'message' => '图片上传成功');
                } else {
                    return array('status' => false, 'src' => $_filename, 'message' => '图片上传失败');
                }
            } else {
                # 上传视频
                $_filename = self::uploads($_field, $_oldSrc, 'video');
                if (!empty($_filename)) {
                    self::setUploadCache($_filename,$mark);
                    return array('status' => true, 'url' => $_filename, 'message' => '视频上传成功');
                } else {
                    return array('status' => false, 'url' => $_filename, 'message' => '视频上传失败');
                }
            }
        } else {
            # 上传标识为空
            return array('status' => false, 'message' => '上传失败缺少判断标识!');
        }
    }




    /**
     * @return bool
     * @context 删除缓存中无用文件方法
     */
    function delUploadCache()
    {
        try{
            $_cache=Session("source_upload");
            if(!empty($_cache)){
                foreach ($_cache as $k=>$v){
                    if($v['type']=='img'){
                        # 判断文件是否存在
                        $_delSrc = ROOT_PATH . DS . 'upload' . DS . $v['src'];
                    }else{
                        $_delSrc = ROOT_PATH . DS . 'upload' .DS . 'video' . DS . $v['src'];
                    }
                    self::delFile($_delSrc);
                }
                return true;
            }else{
                return false;
            }
        }catch (Exception $e){

        }
    }

    /**
     * @param $src_coll
     * @return array
     * @throws BaseException
     * @throws Exception
     * @context 将文件地址在上传文件缓存中删除，以免删除文件
     */
    function delCacheItem($src_coll)
    {
        if(!empty($src_coll)){
            $_exect=array();
            $_cache=Session("source_upload");
            if(is_array($src_coll)){
                $_exect=$src_coll;
            }else{
                array_push($_exect,$src_coll);
            }
            foreach($_cache as $k=>$v){
                if(in_array($v['src'],$_exect)){
                    unset($_cache[$k]);
                }
            }
            $_cache=array_values($_cache);
            Session("source_upload",$_cache);
            return array("status"=>true);
        }else{
            throw new BaseException(array("code"=>403,"msg"=>"删除上传文件缓存参数错误","errorcode"=>10001,"status"=>false));
        }
    }

    /**
     * @param $imgUrl
     * @param $mark
     * @return string
     * @content 图片路径整理(返回 http/https)
     */
    function imgUrl($imgUrl, $mark = false)
    {
        if (!empty($imgUrl) and !is_null($imgUrl)) {
            $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
            if (!$mark) {
                if (file_exists(ROOT_PATH . "public/upload/" . $imgUrl)) {
                    $imgUrl = str_replace('\\', '/', $imgUrl);
                    return $http_type . $_SERVER['HTTP_HOST'] . "/upload/" . $imgUrl;
                } else {
                    return "";
                }
            } else {
                if (file_exists(ROOT_PATH . "public" . DS . $imgUrl)) {
                    $imgUrl = str_replace('\\', '/', $imgUrl);
                    return $http_type . $_SERVER['HTTP_HOST'] . '/' . $imgUrl;
                } else {
                    return "";
                }
            }
        } else {
            return "";
        }
    }


    /**
     * @access public
     * @param string $value
     * @return mixed|string
     * @content 上传base64格式图片
     */
    function uploadBase($value = '')
    {
        $up_dir = ROOT_PATH . DS . 'upload/' . date("Ymd") . "/";//存放在当前目录的upload文件夹下
        $base64_img = trim($value);
        if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_img, $result)) {
            $type = $result[2];
            if (in_array($type, array('pjpeg', 'jpeg', 'jpg', 'gif', 'bmp', 'png'))) {
                if (is_dir($up_dir) || mkdir($up_dir, 0755, true)) {
                    $fileName = self::getMsectime() . self::getRandomString(10) . '.' . $type;
                    $new_file = $up_dir . $fileName;
                    if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_img)))) {
                        return date("Ymd") . "/" . $fileName;
                    } else {
                        return false;
                    }
                }
            } else {
                return false;
            }
        }
    }

    /**
     * @param $_filesrc
     * @return bool
     * @content 按路径删除文件方法
     */
    function delFile($_filesrc)
    {
        if (file_exists($_filesrc)) {
            @unlink($_filesrc);
            return true;
        }else{
            return false;
        }
    }

    /**
     * @param $_file_name  上传的文件名
     * @return bool
     * @context 将上传图片放入缓存
     */
     static function setUploadCache($_file_name,$mark)
    {
        $_cache=Session("source_upload");
        if(!empty($_cache)){
            if(!in_array($_file_name,array_column($_cache,'src'))){
                array_push($_cache,array("src"=>$_file_name,"type"=>$mark));
            }
        }else{
            $_cache=array(array("src"=>$_file_name,"type"=>$mark));
        }
        Session("source_upload",$_cache);
        return true;
    }

    /**
     * @param $filename
     * @param string $delSrc
     * @param string $_type
     * @param int $size
     * @return mixed|string
     * @context 上传文件执行
     */
    private function uploads($filename, $delSrc = '', $_type = '', $size = 204800000000)
    {
        # 判断是否存在要删除的图片,如果存在进行删除,如果不存在正常上传图片
        if (!empty($delSrc)) {
            # 判断文件是否存在
            $_delSrc = ROOT_PATH . DS . 'upload' . DS . $delSrc;

            self::delFile($_delSrc);
        }

        // 获取表单上传文件
        $file = request()->file($filename);
        $fileName = date('Ymd') . DS . self::getMsectime() . self::getRandomString(10);

        // 移动到框架应用根目录/public/upload/ 目录下
        if ($_type == 'video') {
            $info = $file->validate(['size' => $size])->move(ROOT_PATH . DS . 'upload' . DS . 'video', $fileName);
        } else {
            $info = $file->validate(['size' => $size])->move(ROOT_PATH . DS . 'upload', $fileName);
        }
        if ($info) {
            // 成功上传后 获取上传信息
            // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
            //把反斜杠(\)替换成斜杠(/) 因为在windows下上传路是反斜杠径
            $getSaveName = str_replace("\\", "/", $info->getSaveName());
            if ($_type == 'video') {
                return 'video' . '/' . $getSaveName;
            } else {
                return $getSaveName;
            }
        } else {
            // 上传失败获取错误信息
            echo $file->getError();
        }
    }
    /**
     * @return float
     * @content 返回当前的毫秒时间戳
     */
    function getMsectime()
    {
        list($msec, $sec) = explode(' ', microtime());
        $msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        return $msectime;
    }

    /**
     * @param $len  长度
     * @param null $chars  字符集
     * @return string   对应长度的随机数字符串
     * @context 获取随机数
     */
    function getRandomString($len, $chars = null)
    {
        if (is_null($chars)) {
            $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        }
        mt_srand(10000000 * (double)microtime());
        for ($i = 0, $str = '', $lc = strlen($chars) - 1; $i < $len; $i++) {
            $str .= $chars[mt_rand(0, $lc)];
        }
        return $str;
    }

    /**
     * @param $str string 文件名称
     * @return string 根据获取后缀名判断文件类型
     */
    function fileFormat($str)
    {
        // 取文件后缀名
        $str = strtolower(pathinfo($str, PATHINFO_EXTENSION));
        // 图片格式
        $image = array('webp', 'jpg', 'png', 'ico', 'bmp', 'gif', 'tif', 'pcx', 'tga', 'bmp', 'pxc', 'tiff', 'jpeg', 'exif', 'fpx', 'svg', 'psd', 'cdr', 'pcd', 'dxf', 'ufo', 'eps', 'ai', 'hdri');
        // 视频格式
        $video = array('mp4', 'avi', '3gp', 'rmvb', 'gif', 'wmv', 'mkv', 'mpg', 'vob', 'mov', 'flv', 'swf', 'mp3', 'ape', 'wma', 'aac', 'mmf', 'amr', 'm4a', 'm4r', 'ogg', 'wav', 'wavpack');
        // 压缩格式
        $zip = array('rar', 'zip', 'tar', 'cab', 'uue', 'jar', 'iso', 'z', '7-zip', 'ace', 'lzh', 'arj', 'gzip', 'bz2', 'tz');
        // 文档格式
        $text = array('exe', 'doc', 'ppt', 'xls', 'wps', 'txt', 'lrc', 'wfs', 'torrent', 'html', 'htm', 'java', 'js', 'css', 'less', 'php', 'pdf', 'pps', 'host', 'box', 'docx', 'word', 'perfect', 'dot', 'dsf', 'efe', 'ini', 'json', 'lnk', 'log', 'msi', 'ost', 'pcs', 'tmp', 'xlsb');
        // 匹配不同的结果
        switch ($str) {
            case in_array($str, $image):
                return 'img';
                break;
            case in_array($str, $video):
                return 'video';
                break;
            case in_array($str, $zip):
                return 'zip';
                break;
            case in_array($str, $text):
                return 'text';
                break;
            default:
                return 'img';
                break;
        }
    }


    /**
     * [ContentStaticReplace 编辑器中内容的静态资源替换]
     * @author   juzi
     * @blog     https://blog.csdn.net/juziaixiao
     * @version  1.0.0
     * @datetime 2020年6月22日13:45:48
     * @param    [string]    $content [在这个字符串中查找进行替换]
     * @param    [string]    $type    [操作类型[get读取额你让, add写入内容](编辑/展示传入get,数据写入数据库传入add)]
     * @return   [string]             [正确返回替换后的内容, 则返回原内容]
     */
    public static function ContentStaticReplace($content, $type = 'get')
    {
        switch($type)
        {
            // 读取内容
            case 'get':
                return str_replace('src="/upload/', 'src="'.__MY_PUBLIC_URL__.'upload/', $content);
                break;

            // 内容写入
            case 'add':
                return str_replace(array('src="'.__MY_PUBLIC_URL__.'upload/', 'src="'.__MY_ROOT_PUBLIC__.'upload/'),
                    'src="/upload/', $content);
        }
        return $content;
    }



    /**
     * @context 附件展示地址处理
     * @author   juzi
     * @blog     https://blog.csdn.net/juziaixiao
     * @version  1.0.0
     * @datetime 2020年6月22日13:45:48
     * @param    [type]                   $value [description]
     */
    public static function AttachmentPathViewHandle($value,$is_local=false)
    {
        if(!empty($value))
        {
            if($is_local)
            {
                return config('leegame.attachment_localhost').'upload/'.$value;
            }

            if(substr($value, 0, 4) != 'http')
            {
                return config('leegame.attachment_host').$value;
            }


            return $value;
        }
        return '';
    }
}